《汇编语言》 |
您所在的位置:网站首页 › int 指令三菱 › 《汇编语言》 |
《汇编语言》- 读书笔记 - 第13章-int 指令
13.1 int 指令13.2 编写供应用程序调用的中断例程中断例程:求一 word 型数据的平方主程序中断处理程序执行效果
中断例程:将一个全是字母,以0结尾的字符串,转化为大写主程序中断处理程序执行效果
13.3 对 int、iret 和栈的深入理解主程序中断处理程序分析执行效果
检测点 13.113.4 BIOS 和 DOS 所提供的中断例程13.5 BIOS 和 DOS 中断例程的安装过程BIOS中断例程的安装:DOS中断例程的安装:
13.6 BIOS 中断例程应用功能 02H 设置光标位置功能 09H 在光标位置显示字符
13.7 DOS 中断例程应用(INT 21H)功能 4CH:返回码方式的终止进程功能 09H:输出一个字符串到标准输出设备上
实验 13 编写、应用中断例程参考资料
13.1 int 指令
int n 指令的功能是:引发 n 号中断过程,从而执行 n号中断处理程序。 系统将一些具有一定功能的子程序,以中断处理程序的方式提供给应用程序调用。 我们在编程的时候,可以用 int 指令调用这些子程序。 当然,也可以自己编写些中断处理程序供别人使用。 以后,我们可以将中断处理程序简称为中断例程。 13.2 编写供应用程序调用的中断例程 中断例程:求一 word 型数据的平方 问题一编写、安装中断 7ch 的中断例程。功能求一 word 型数据的平方。参数(ax)=要计算的数据。返回dx、ax 中存放结果的高 16 位和低 16 位。应用举例求 2*3456^2 = 16C8000h = 23,887,872 主程序 assume cs:code code segment start: mov ax,3456 ; (ax)=3456 int 7ch ; 调用中断 7ch 的中断例程,计算ax中的数据的平方 ; dx:ax 存放结果,将结果乘以2 add ax,ax ; 先加低位 adc dx,dx ; 再加高位(这里用了进位加法) ; 23887872 mov ax,4c00h int 21h code ends end start 中断处理程序 assume cs:code code segment start: ; ====================== 安装 ==================== ; ------------------- 复制数据 ------------------- mov ax,cs mov ds,ax mov si,offset sqr ;设置 ds:si 指向源地址 mov ax,0 mov es,ax mov di,200h ;设置 es:di 指向目的地址 mov cx,offset sqrend-offset sqr ;设置 cx为传输长度 cld ;设置传输方向为正。movsb中si,di递增 rep movsb ;重复复制数据次数由 cx 控制 ; ------------------- 复制数据 ------------------- ; ----------------- 设置中断向量 ----------------- mov ax,0 mov es,ax ; 段地址 0 mov word ptr es:[7ch*4],200h ; 设置【中断处理程序】的:偏移地址 mov word ptr es:[7ch*4+2],0 ; 设置【中断处理程序】的:段地址 ; ----------------- 设置中断向量 ----------------- ; ====================== 安装 ==================== mov ax, 4c00H ; 退出 int 21H ; ======================================================= ; --------------------- 中断处理程序 -------------------- ; ax 的平方 ; ------------------------------------------------------- ; 参数:ax 要计算的数据。 ; 返回:dx、ax 中存放结果的高 16 位和低 16 位。 ; ------------------------------------------------------- sqr: mul ax ; ax * ax 结果 dx=高16位,ax=低16位 iret ; 返回原程序。 pop IP, pop CS, popf sqrend: nop ; --------------------- 中断处理程序 -------------------- ; ======================================================= code ends end start 安装功能跟之前都是一样的,只是改下值就行了。中断处理程序也很简单就是一个乘法就返回了。 执行效果没什么新知识点,都是之前学过的:安装、遍历字符串、字符转大写。 执行效果这里是本节的重点了:欺骗善良无知的iret。 在中断触发前,IP 指向了标号 se 处。(在主程序中我已经计算出了se到s之间的偏移)中断过程中,会备份当前寄存器:pushf, push cs, push ip 。中断处理程序中:我们在 add [bp+2],bx ; 分析:1 这句修改了栈中备份的IP的值。 所以iret恢复后其实指向了标号 s,这也就实现了跳回去重新执行的效果。 执行效果《汇编语言》- 读书笔记 - 检测点 13.1 13.4 BIOS 和 DOS 所提供的中断例程 BIOS(基本输入输出系统)存储在系统板的ROM中,包含以下内容: 硬件系统的检测和初始化程序外部中断和内部中断的中断例程用于对硬件设备进行I/O操作的中断例程其他与硬件系统相关的中断例程 DOS操作系统同样提供了中断例程,这些例程是操作系统向程序员提供的编程接口。BIOS和DOS提供的中断例程包括许多子程序,它们实现了常见的编程功能。程序员可以通过int指令直接调用:BIOS或DOS的中断例程来完成特定任务。与硬件设备相关的DOS中断例程通常会进一步调用BIOS的中断例程以执行底层硬件操作。 13.5 BIOS 和 DOS 中断例程的安装过程在8086架构的早期个人计算机系统中,BIOS和DOS中断例程的安装过程并非由用户程序直接执行安装,而是内置于系统的初始化过程中。以下是一个简化的概述: BIOS中断例程的安装: 开机后,CPU 一加电,自动从FFFF:0000H地址处开始执行ROM中的代码(即BIOS)。 (这个位置存放着一条跳转指令,它会跳转到ROM中的实际BIOS启动代码区域。)BIOS首先进行硬件自检(POST, Power-On Self-Test),检测和初始化硬件设备。BIOS建立中断向量表,将自身的中断处理程序 的入口地址填入到中断向量表对应的内存位置。 (只需要有登记入口地址,因为中断处理程序本身已固化在BIOS的ROM中。) DOS中断例程的安装: 硬件自检和初始化完成后,调用 int 19h 进行操作系统的引导。 1.1. 在BIOS对 int 19h 中断做出响应时,它首先从硬盘的第一个扇区(即主引导记录MBR)读取512字节的数据到内存特定位置(如0x7C00)。 1.2. MBR中的前446字节通常是机器码构成的操作系统引导程序(Boot Loader),该引导程序接着会被CPU执行。 1.3. 引导程序的任务是找到并加载实际的操作系统,例如MS-DOS或更现代的操作系统的核心文件,并将控制权转交给操作系统。当DOS启动时,它会接管控制权,并且根据需要重定向某些中断向量,以便调用自己的中断例程来处理特定的服务请求。DOS通常会保留一部分中断向量用于调用原始的BIOS服务,同时提供额外的中断服务例程以支持文件操作、磁盘读写等功能。总之,在8086环境下,BIOS和DOS中断例程的安装是指在系统启动阶段由固件和操作系统自动完成中断向量表的填充和设置,而不是程序员手动安装的过程。 《汇编语言》- 读书笔记 - 检测点 13.2. 13.6 BIOS 中断例程应用 功能 02H 设置光标位置 INT 10H显示服务 Video Service功能02H设置光标位置参数AH=调用 02H 号子程序 BH=显示页码 DH=行(Y坐标) DL=列(X坐标)返回无 assume cs:code code segment start: mov ah,2 ; 设置光标位置 mov bh,0 ; 显示页码,第0页 mov dh,5 ; dh 中放行号 mov dl,12 ; dl 中放列号 int 10h ok: mov ax,4c00h int 21h code ends end start在8086架构下,int 21h是DOS操作系统为应用程序提供的一种系统API。 通过调用int 21h并设置不同的AH寄存器值,程序员可以请求执行多种操作,如:文件操作、设备I/O、内存管理等。 这些中断服务例程相当于DOS系统的函数库,使得应用程序能够与操作系统进行交互和访问底层资源。 功能 4CH:返回码方式的终止进程 INT 21HDOS 中断例程功能 4CH终止程序的执行,并可返回一个代码参数AH=功能号 4CH AL=返回值返回无 mov ah,4ch ; 调用 4ch 号功能 mov al,00h ; 返回值 int 21h 功能 09H:输出一个字符串到标准输出设备上 INT 21HDOS 中断例程功能09H输出一个字符串到标准输出设备上。待显示的字符串以$作为其结束标志参数AH=功能号09H DS:DX=待输出字符的地址返回无 assume cs:code data segment db 'Welcome to masm','$' data ends code segment start: mov ah,2 ; 设置光标位置 mov bh,0 ; 第0页显示 mov dh,5 ; dh 中放行号 mov dl,12 ; dl 中放列号 int 10h mov ax,data mov ds,ax mov dx,0 ;ds:dx指向字符串的首地址 data:0 mov ah,9 int 21h ok: mov ax,4c00h int 21h code ends end start《汇编语言》- 读书笔记 - 第13章-实验13编写、应用中断例程 参考资料DOS 中断参考手册 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |